package smartMarket.fiscal;

import java.sql.SQLException;
import java.util.Vector;

import excecoes.estoque.DinheiroNegativoException;
import excecoes.estoque.NenhumProdutoEncontradoException;
import excecoes.estoque.QuantidadeNegativaException;

import banco.estoque.BancoProduto;
import excecoes.fiscal.CodigoInvalidoException;
import java.text.DecimalFormat;
import smartMarket.estoque.Produto;

public abstract class Transacao {

    // Atributos
    private String data;
    private int numero;
    private Float valorTotal = 0.00f;
    private Vector<Integer> quantidade = new Vector<Integer>();
    private Vector<Integer> codigo = new Vector<Integer>();
    private Vector<Float> preco = new Vector<Float>();
    private BancoProduto banco = new BancoProduto();
    private Float desconto = 0.0f;

    public float getDesconto(){
        return desconto;
    
    }
    
    public void setDesconto(Float desconto) throws DinheiroNegativoException{
        if (desconto < 0) {
            throw new DinheiroNegativoException("O desconto não pode ser negativo");
        }
        this.desconto = desconto;     
    } 
    
    // Gets

    public int getNumero() {
        return numero;
    }

    public float getValorTotal() {
        return (valorTotal - desconto);
    }
    
    public float getTotal() {
        return valorTotal;
    }
    
    public void setTotal(float total) {
        this.valorTotal = total;
    }

    public Vector<Integer> getQuantidade() {
        return quantidade;
    }

    public Vector<Integer> getCodigo() {
        return codigo;
    }

    public Vector<Float> getPreco() {
        return preco;
    }

    public String getData() {/////
        return data;
    }

    // Sets
    public void setNumero(int numero) {
        this.numero = numero;
    }

    public void setQuantidade(Vector<Integer> quantidade) {
        this.quantidade = quantidade;
    }

    public void setCodigo(Vector<Integer> codigo) {
        this.codigo = codigo;
    }

    public void setPreco(Vector<Float> preco) {
        this.preco = preco;
    }

    public void setData(String data) {
        this.data = data;
    }

    // Métodos
    public void addCarrinho(int codigo, int quantidade, float preco) throws NumberFormatException, SQLException, DinheiroNegativoException, QuantidadeNegativaException, NenhumProdutoEncontradoException, CodigoInvalidoException {
        if (quantidade < 0) {
            throw new QuantidadeNegativaException();
        } else if (preco < 0) {
            throw new DinheiroNegativoException();
        } else if (banco.buscar(codigo) != null) {
            this.codigo.add(codigo);
            this.quantidade.add(quantidade);
            this.preco.add(preco);
            this.valorTotal += (preco * quantidade);
        } else {
            throw new CodigoInvalidoException();
        }
    }

    public void addCarrinho(String codigoBarras, int quantidade, float preco) throws NumberFormatException, SQLException, DinheiroNegativoException, QuantidadeNegativaException, NenhumProdutoEncontradoException, CodigoInvalidoException {
        Produto produto = banco.buscar(codigoBarras);
        addCarrinho(produto.getCodigo(), quantidade, preco);
    }

    public void removeCarrinho(int codigo) {
        for (int x = 0; x < this.codigo.size(); x++) {
            if (this.codigo.elementAt(x) == codigo) {
                this.valorTotal -= (this.preco.elementAt(x) * this.quantidade.elementAt(x));
                this.codigo.remove(x);
                this.quantidade.remove(x);
                this.preco.remove(x);
                break;
            }
        }
    }

    /////
    public void removeCarrinho(int codigo, int qtd) {
        for (int x = 0; x < this.codigo.size(); x++) {
            if (this.codigo.elementAt(x) == codigo && this.quantidade.elementAt(x) == qtd) {
                this.valorTotal -= (this.preco.elementAt(x) * this.quantidade.elementAt(x));
                this.codigo.remove(x);
                this.quantidade.remove(x);
                this.preco.remove(x);
                break;
            }
        }
    }

    public void removeCarrinho(String codigoBarras) throws NumberFormatException, SQLException, DinheiroNegativoException, QuantidadeNegativaException, NenhumProdutoEncontradoException {
        Produto produto = banco.buscar(codigoBarras);
        this.removeCarrinho(produto.getCodigo());
    }

    public void customFormat(String pattern, double value) {
        DecimalFormat myFormatter = new DecimalFormat(pattern);
        String output = myFormatter.format(value);
        System.out.println(value + "  " + pattern + "  " + output);
    }

    public void alterarCarrinho(int codigo, int quantidade, float preco) throws QuantidadeNegativaException, DinheiroNegativoException {
        if (quantidade <= 0) {
            throw new QuantidadeNegativaException();
        } else if (preco <= 0) {
            throw new DinheiroNegativoException();
        } else {
            for (int x = 0; x < this.codigo.size(); x++) {
                if (this.codigo.elementAt(x) == codigo) {
                    this.valorTotal -= (this.preco.elementAt(x) * this.quantidade.elementAt(x));
                    this.valorTotal += (preco * quantidade);
                    customFormat("###,###.###", this.valorTotal);
                    this.codigo.remove(x);
                    this.quantidade.remove(x);
                    this.preco.remove(x);


                    this.codigo.add(x, codigo);
                    this.preco.add(x, preco);
                    this.quantidade.add(x, quantidade);
                    break;
                }
            }
        }

        
    }

    public void alterarCarrinho(String codigoBarras, int quantidade, float preco) throws NumberFormatException, SQLException, DinheiroNegativoException, QuantidadeNegativaException, NenhumProdutoEncontradoException {
        Produto produto = banco.buscar(codigoBarras);
        this.alterarCarrinho(produto.getCodigo(), quantidade, preco);
        System.out.println("test" + valorTotal);
    }
}